DP算法(Dynamic Programming,俗称动态规划)是最经典算法之一

DP算法(Dynamic Programming,俗称动态规划)是最经典算法之一.本笔记以耳熟能详的数塔问题为引子,深入讨论01背包的解决方法.

  首先,如下图所示,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

  这个问题,对于任意一个结点,直接选择数字大的子结点显然是不行的.以9为例,如果选择15,当前和24>21,但是15的两个子结点太小,24+6+18<21+10+18.由此可见,这样求出每阶段的部分最优解并不是全局最优解.另外,如果用蛮力算法,每条路径都遍历一次,那么层数为n时,路径总数呈指数级增长:

  显然这种方法的计算量太大,也不可取.那么此时用DP算法是行之有效的.具体思想为:从倒数第二层开始,一层一层向上遍历.倒数第二层第一个结点是2,如果路径经过2,那么肯定会选择数值较大左子结点19. 便用19+2=21代替原先的2. 同理18改为18+10=28,9改为19,5改为21. 这样倒数第二层就变成21 28 19 21四个结点,再将最后一层舍弃.这样一层层向上,直到第一层,选择第二层较大的那个结点加到9上面去,就得出了全局最优解.

  代码实现:如果数字塔为n层,开辟一个n*n的二维数组即可,非常简单,此处省略.

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值